# 类
# 实例和对象
# 实例化
# 类的属性
# 类的引用
#     c.name
# 类的调用
#     class cl:
#         pass
#     c = cl()
# 类变量
#     直接在类中定义好对变量
# 实例方法
#     def func(self):
#         pass
#
# 实例变量
#     self.name
# 构造函数
#     __init__
#     用来初始化，对实例变量赋值或执行一些初始化方法
# 析构函数
#     __del__
#
# 类方法
#     @classmethod
#     类方法不再传入self,传入的是cls
# 静态方法
#     @staticmethod
#     可以不实例化直接使用，也可以实例化以后调用，但是不需要也不能再使用self

#什么是类？
class User:

    #类变量、实例变量
    def __init__(self):  #类初始化
        self.name="张三"
        self.age=18
        self.address="beijing"

    def todo(self):
        print("去%s"%self.address)

    def goto(self):
        pass


U=User()
U.todo()


class Driver():
    count=1 #类变量
    def __init__(self,car,year): #构造还是，构造函数可以有参，可以无参
        self.car=car #实例变量
        self.year=year
        self.login=self.login_sys()
        self.age=self.get_age()

    def do(self): #实例方法
        print("我在开%s" % self.car)

    def login_sys(self):
        print("现在已经登录")

    def get_age(self):
        print("计算 年龄")
        return 2021-self.year

d=Driver("BMW",2000) #实例化
d.do() #调用：也是执行
d.get_age()
print(d.get_age())




# name = "xiaoming"
# print(name + "穿衣服")
# print(name + "下楼")
# print(name + "出门")
# print(name + "坐车")
# print(name + "到银行存钱")

# name1 = "xiaowang"
# print(name1 + "穿衣服")
# print(name1 + "下楼")
# print(name1 + "出门")
# print(name1 + "坐车")
# print(name1 + "到银行存钱")

# name2 = "xiaozhang"
# print(name2 + "坐车")
# print(name2 + "到银行存钱")

print('=================')


def go_to_bank(name):
    print(name + "穿衣服")
    print(name + "下楼")
    print(name + "出门")
    print(name + "坐车")
    print(name + "到银行存钱")


def go_to_bank2(name):
    print(name + "坐车")
    print(name + "到银行存钱")


class todo():
    age = 18

    def __init__(self, name):
        self.name = name

    def outhome(self):
        print(self.name + "穿衣服")
        print(self.name + "下楼")
        print(self.name + "出门")

    def goto_bank(self):
        print(self.name + "坐车")
        print(self.name + "到银行存钱")

    def result(self, a):  # 如何要求返回的是 a.name ，则a首先一定是一个对象，同时还得有name这个属性
        return a.name

    def resulta(a):  # a == self
        return a.name

    @classmethod  # 类方法
    def cm(cls, a):  # 类方法中如果调用 实例方法，需要把当前方法实例化以后，替代 self 传入
        td = todo(a)
        cls.goto_bank(td)
        cls.outhome(td)
        # print(cls.name)
        print(cls.age)

    # 工具类：
    #  json工具类  json转string、string转json     String工具类  判断是否为None或空字符串("")
    #  Object工具类    判断传入的对象是否为None
    #  数组用工具类




# go_to_bank("xiaoming")
# go_to_bank("xiaowang")
# go_to_bank2("xiaozhang")

t = todo("xiaoli")
t.outhome()
print("=============")
# a = ?
a = todo("xiaowang")
# a.outhome()
# print(t.result(a))

a.cm("xiaohuang")
